TerraformでAWS CodeCommitのGit認証情報を生成してAWS Systems Manager Parameter StoreやAWS Secrets Managerに保存する

TerraformでAWS CodeCommitのGit認証情報を生成してAWS Systems Manager Parameter StoreやAWS Secrets Managerに保存する

Clock Icon2022.07.27

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

「Terraformで作ったCodeCommitのGit認証情報をいい感じに管理したい」

GitLabリポジトリをCodeCommitにミラーリングしたい時がありました。

以下の記事で設定できました。(感謝!)

GitLabのリポジトリをCodeCommitにミラーリングする流れとしては、以下になります。

  1. CodeCommit作成
  2. IAMポリシーとIAMユーザー作成
  3. CodeCommit Git認証情報の作成
  4. GitLabにてミラーリングの設定(Git認証情報をセット)

Terraformを使うにあたり、「3.CodeCommit Git認証情報の作成」の部分で作成するGit認証情報の管理すればいいんだろうと少し悩みました。

結論:

  • Git認証情報の作成: 「aws_iam_service_specific_credential」で作成可能
  • 認証情報の管理: SystemManager ParameterStoreかSecretsManagerに保存

サンプルコード交えて方法を紹介します。

やってみる

AWS CodeCommitのリポジトリ・IAM関連リソース・Git認証情報の作成

リポジトリとCodeCommit用のIAMユーザーとIAMグループ、Git認証情報を作成しています。

Git認証情報はaws_iam_service_specific_credentialで作成できます。

ちなみに、terraform-provider-aws v4.1.0(2022/2)以前ではCodeCommitの認証情報を作成することはできず、local-execを使用する必要がありました。

Feature request: IAM Service Specific credentials · Issue #3233 · hashicorp/terraform-provider-aws

resource "aws_iam_user" "codecommit" {
  name = "codecommit-user"
  path = "/"
}

resource "aws_iam_user_group_membership" "codecommit" {
  user = aws_iam_user.codecommit.name

  groups = [
    aws_iam_group.codecommit.name,
  ]
}

resource "aws_iam_service_specific_credential" "codecommit" {
  service_name = "codecommit.amazonaws.com"
  user_name    = aws_iam_user.codecommit.name
}

resource "aws_iam_group" "codecommit" {
  name = "codecommit-group"
  path = "/"
}

resource "aws_iam_policy" "codecommit" {
  name        = "codecommit-group-policy"
  policy      = data.aws_iam_policy_document.codecommit.json
}

data "aws_iam_policy_document" "codecommit" {
  statement {
    effect    = "Allow"
    actions   = ["codecommit:GitPull", "codecommit:GitPush"]
    resources = ["arn:aws:codecommit:${data.aws_region.current.name}:${data.aws_caller_identity.current.id}:*"]
  }
}

resource "aws_iam_group_policy_attachment" "codecommit" {
  group      = aws_iam_group.codecommit.name
  policy_arn = aws_iam_policy.codecommit.arn
}

Git認証情報の登録

上記で、Git認証情報の作成ができました。

Outputsに出したりtfstateを確認すればGit認証情報は確認できますが、Systems Manager Parameter Storeや SecretsManagerに値を保存した方が管理しやすいかと思います。

どちらを使うかはお好みですが、それぞれ紹介します。

Systems Manager Parameter Store

resource "aws_ssm_parameter" "codecommit_username" {
  name        = "codecommit-username"
  type        = "SecureString"
  value       = aws_iam_service_specific_credential.codecommit.service_user_name
}

resource "aws_ssm_parameter" "codecommit_password" {
  name        = "codecommit-password"
  type        = "SecureString"
  value       = aws_iam_service_specific_credential.codecommit.service_password
}

SecretsManager

resource "aws_secretsmanager_secret" "codecommit" {
  name = "codecommit-git-secrets"
}

resource "aws_secretsmanager_secret_version" "codecommit" {
  secret_id = aws_secretsmanager_secret.codecommit.id
  secret_string = jsonencode({
    "UserName" : aws_iam_service_specific_credential.codecommit.service_user_name,
    "Password" : aws_iam_service_specific_credential.codecommit.service_password,
  })
}

おわりに

個人的には、こういった情報(Git認証情報)はキーバリューで管理したいのでSecretsManagerを選ぶことが多いです。

SecretsManagerとParameter Storeの違いは以下がわかりやすいです。

Q: Secrets Manager と Parameter Store の違いは何ですか? AWS Systems Manager のよくある質問

以上、AWS事業本部の佐藤(@chari7311)でした。

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.